package me.weyye.todaynews.utils; import android.util.Base64; import com.orhanobut.logger.Logger; import java.util.Random; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.zip.CRC32; import me.weyye.todaynews.base.ApiService; import me.weyye.todaynews.base.AppClient; import me.weyye.todaynews.base.ResultResponse; import me.weyye.todaynews.model.Video; import me.weyye.todaynews.model.VideoModel; import rx.Observable; import rx.Subscriber; import rx.android.schedulers.AndroidSchedulers; import rx.functions.Func1; import rx.schedulers.Schedulers; /** * Created by Administrator on 2017/2/9 0009. */ public abstract class VideoPathDecoder { public void decodePath(final String srcUrl) { AppClient.getApiService().getVideoHtml(srcUrl) // Observable.just(videoId) .flatMap(new Func1<String, Observable<ResultResponse<VideoModel>>>() { @Override public Observable<ResultResponse<VideoModel>> call(String response) { Pattern pattern = Pattern.compile("videoid:\'(.+)\'"); Matcher matcher = pattern.matcher(response); if (matcher.find()) { String videoId = matcher.group(1); Logger.i(videoId); //将/video/urls/v/1/toutiao/mp4/{videoid}?r={Math.random()},进行crc32加密。 String r = getRandom(); CRC32 crc32 = new CRC32(); String s = String.format(ApiService.URL_VIDEO, videoId, r); crc32.update(s.getBytes()); String crcString = crc32.getValue() + ""; String url = ApiService.HOST_VIDEO + s + "&s=" + crcString; Logger.i(url); return AppClient.getApiService().getVideoData(url); } return null; } }) .map(new Func1<ResultResponse<VideoModel>, Video>() { @Override public Video call(ResultResponse<VideoModel> videoModelResultResponse) { VideoModel.VideoListBean data = videoModelResultResponse.data.video_list; if (data.video_3 != null) { return updateVideo(data.video_3); } if (data.video_2 != null) { return updateVideo(data.video_2); } if (data.video_1 != null) { return updateVideo(data.video_1); } return null; } private String getRealPath(String base64) { return new String(Base64.decode(base64.getBytes(), Base64.DEFAULT)); } private Video updateVideo(Video video) { video.main_url = getRealPath(video.main_url); return video; } }) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Subscriber<Video>() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { onDecodeError(e); } @Override public void onNext(Video s) { onSuccess(s); } }); } public abstract void onSuccess(Video s); public abstract void onDecodeError(Throwable e); private String getRandom() { Random random = new Random(); StringBuilder result = new StringBuilder(); for (int i = 0; i < 16; i++) { result.append(random.nextInt(10)); } return result.toString(); } }